#include <float.h> void _fpreset(); переинициализирует математический пакет с плавающей точкой.
Описание:
Функция _fpreset переинициализирует математический пакет сплавающей точкой. Эта функция обычно используется с процедурами signal , system или с семейством процедур exec , spawn.
Если программа вместе с функцией signal захватывает сигналы ошибок с плавающей точкой (SIGFPE ), то она при вызове _fpreset благополучно восстанавливается из ошибок с плавающей точкой и выполняет longjmp.
Замечание!
В версиях MS DOS , более ранних чем 4.0, child -процесс, выполнимый в exec, spawn или system , может воздействовать на состояние с плавающей точкой parent-процесса, если используется 8087 или 80287 сопроцессор. Поэтому, если используется сопроцессор 8087 либо 80287 , рекомендуются помнить, что:
* exec, spawn, system не могут вызываться в процессе вычисления выражения с плавающей точкой;
* _fpreset должна быть вызвана после этих процедур, если child -процесс может выполнить требуемую операцию.
Пример.
#include <stdio.h>
#include <signal.h>
#include <setjmp.h>
#include <float.h>
int fphandler ();
jmp_buf mark;
double a = 1.0, b = 0.0, c;
main()
{
if(signal(SIGFPE, fphandler)==(int(*)())-1)
abort();
if(setjmp(mark)==0) {
c = a/b;
printf("Should never get here\n");
}
printf("Recovered from floating-point error\n");
}
int fphandler(sig,num)
int sig,num;
{
printf("signal=%d subcode =%d\n",sig,num);
_fpreset();
/* переинициализирует пакет с плавающей точкой */
longjmp(mark,-1);
}